<?php

namespace Transaccion\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Transaccion\Model\Entity\DatosAcademicos;
use Transaccion\Controller\Service\GenericService;
use Transaccion\Model\Dao\DatosAcademicosDAO;
use Componentes\Controller\VariablesGlobales;
use Inscripcion\Controller\Service\ControlInscripcionService;
use Maestros\Controller\Service\TurnoService;
use Maestros\Controller\Service\SeccionService;

//SERVICIO
class DatosAcademicosService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $datosAcademicosService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$datosAcademicosService == null) {
            self::$datosAcademicosService = new DatosAcademicosService($adapter);
        }
        return self::$datosAcademicosService;
    }

    public function getDatosAcademicosDao() {
        return DatosAcademicosDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type $id
     * @return type
     */
    public function getRegistro($id) {
        $data = null;
        $success = false;
        $datosAcademicos = $this->obtenerDatosAcademicosSegunId($id);
        if ($datosAcademicos->getId() != null) {
            $data[0] = $datosAcademicos->objectToArray();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data, null);
    }

    public function getRegistroCompleto($id) {
        $datosAcademicos = $this->obtenerDatosAcademicosSegunId($id);
        return $this->armarRegistroCompleto($datosAcademicos);
    }

    public function getRegistroCompletoSegunIngresoMalla($id) {
        $registros = $this->obtenerDatosAcademicosSegunIngresoMalla($id);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'BLOQUES ENCONTRADOS';
            $datosacademicos = $this->llenarArreglo($registros);
        }
        $output = array(
            'success' => $success,
            'data' => $datosacademicos,
            'total' => count($bloques),
            'mensaje' => $mensaje
        );
        return $output;
    }

    public function armarRegistroCompleto($datosAcademicos) {
        $mensaje = 'DatosAcademicos no encontrado';
        $data = null;
        $success = false;
        $servicioControlInscricion = ControlInscripcionService::getInstance($this->dbAdapter);
        $ControlInscripcion = $servicioControlInscricion->getRegistroCompleto($datosAcademicos->getControlInscripcion());
        if ($datosAcademicos->getId() != null) {
            $data[0] = $datosAcademicos->objectToArray();
            $success = true;
            $data[0]['_controlInscripcion'] = $ControlInscripcion['data'];
            $mensaje = 'DATOS ACADEMICOS ENCONTRADA';
        }
        $output = array(
            'success' => $success,
            'data' => $data,
            'total' => count($data),
            'mensaje' => $mensaje
        );
        return $output;
    }

    public function llenarArreglo($registros) {
        foreach ($registros as $row) {
            $datosAcademicos[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($datosAcademicos); $i++) {
            $datoacademico = $this->getRegistroCompleto($datosAcademicos[$i]['id']);
            $datosAcademicos[$i] = $datoacademico['data'];
        }
        return $datosAcademicos;
    }

//------Retornan los objetos-------

    public function getUltimoDatosAcademicosSegunCedula($cedula) {
        $servicioTurno = TurnoService::getInstance($this->dbAdapter);
        $servicioSeccion = SeccionService::getInstance($this->dbAdapter);
        $data = null;
        $registros = $this->getDatosAcademicosDao()->getDatosAcademicosSegunCedulaOrderLapsoDes($cedula);
        $data = UtilsArrayController::llenarData($registros);
        $success = false;
        $datosAcademicos = $this->obtenerUltimoDatosAcademicosSegunCedula($data);
        if ($datosAcademicos->getId() != null) {
            $data2[0] = $datosAcademicos->objectToArray();
            $data2[0]['_ingresoMalla'] = $data[0]['id_ingreso_malla'];
            $data2[0]['_condicionMatricular'] = $data[0]['id_condicion_matricular'];
            $data2[0]['_trayectoSemestre'] = $data[0]['id_trayecto_semestre'];
            $seccion = $servicioSeccion->obtenerSeccionSegunId($data[0]['id_seccion']);
            $data2[0]['_seccion'] = $seccion->getCodigoSeccion();
            $data2[0]['_controlInscripcion'] = $data[0]['id_control_inscripcion'];
            $data2[0]['especialidad'] = $data[0]['especialidad'];
            $turno = $servicioTurno->obtenerTurnoSegunId($data2[0]['_turno']);
            $data2[0]['_turno'] = $turno->getDescripcion();
            $success = true;
        }
        return UtilsArrayController::organizarOutput($success, $data2[0], null);
    }

    public function obtenerUltimoDatosAcademicosSegunCedula($data) {
        $datosAcademicos = new DatosAcademicos($data[0]);
        return $datosAcademicos;
    }

    /**
     * Dado el id del datosIngreso se trae el registro asociado
     * convirtiendolo primero en objeto y luego lo retorna
     * @param $id type string
     * @return Objeto IngresoMalla
     */
    public function obtenerDatosAcademicosSegunId($id) {
        $registros = $this->getDatosAcademicosDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $datosAcademicos = new DatosAcademicos($data[0]);
        return $datosAcademicos;
    }

    public function obtenerDatosAcademicosSegunIngresoMalla($id) {
        $registros = $this->getDatosAcademicosDao()->getRegistroSegunIngresoMalla($id);
        return $registros;
    }

    /**
     * @param type $data
     * @return type
     */
    public function createRegistro($idIngresoMalla, $idLapso, $idCondicionMatricular, $idTrayectoSemestre, $idTurno, $idSeccion, $idControlInscripcion) {
        // Guardar el registro
        $datosAcademicos = new DatosAcademicos;
        $datosAcademicos->setId(0);
        $datosAcademicos->setIngresoMalla($idIngresoMalla);
        $datosAcademicos->setLapso($idLapso);
        $datosAcademicos->setCondicionMatricular($idCondicionMatricular);
        $datosAcademicos->setTrayectoSemestre($idTrayectoSemestre);
        $datosAcademicos->setTurno($idTurno);
        $datosAcademicos->setSeccion($idSeccion);
        $datosAcademicos->setControlInscripcion($idControlInscripcion);
        $data = $datosAcademicos->objectToArrayBD();
        $registros = $this->getDatosAcademicosDao()->createRegistro($data);
        return $registros;
    }

    /** eliminar de 
     *  datos academisco de acuerdo al ID
     * @param type $id
     * @return type
     */
    public function deleteDatosAcademicosSegunId($id) {
        $result = $this->getDatosAcademicosDao()->eliminarDatosAcademicosSegunId($id);
        return $result;
    }

//---------------------------------
}
